//4.设计一个动物园管理系统，其中包含Animal接口、Mammal类（实现Animal接口）、Dog类（继承自Mammal类）和Cat类（也继承自Mammal类）。
//（1）定义Animal接口，包含一个方法makeSound()，该方法没有返回值（即返回类型为void）。
//（2）定义Mammal类，实现Animal接口，并实现makeSound()方法（具体实现内容不限）。在Mammal类中，定义一个受保护的构造方法，它接受一个字符串参数作为动物的名字，并设置到类的私有属性中。
//（3）定义Dog和Cat类，它们都继承自Mammal类。Dog类的makeSound()方法应输出“汪汪汪”，Cat类的makeSound()方法应输出“喵喵喵”。然后，编写一个测试类ZooTest，在该类中创建一个Dog对象和一个Cat对象，并使用一个Animal类型的父类引用变量接收它们，再用父类引用调用makeSound()方法。
//编码：
//（1）创建一个接口Animal
// Animal接口
public interface Animal {
    void makeSound();
}

//（2）创建一个Mammal类
// Mammal类
class Mammal implements Animal {
    protected String name;

    // 受保护的构造方法
    protected Mammal(String name) {
        this.name = name;
    }

    // 实现Animal接口的makeSound方法（具体实现内容不限）
    @Override
    public void makeSound() {
        System.out.println(name + " 发出声音"); // 示例实现，具体声音由子类定义
    }

    // 可以添加一个getName方法以便测试时获取名字
    public String getName() {
        return name;
    }
}

//（3）创建一个Dog类
// Dog类
class Dog extends Mammal {
    public Dog(String name) {
        super(name); // 调用父类的构造方法
    }

    @Override
    public void makeSound() {
        System.out.println(getName() + "：汪汪汪");
    }
}

//（4）创建一个Cat类
// Cat类
class Cat extends Mammal {
    public Cat(String name) {
        super(name); // 调用父类的构造方法
    }

    @Override
    public void makeSound() {
        System.out.println(getName() + "：喵喵喵");
    }
}

//（5）创建一个ZooTest测试类
// ZooTest测试类
class ZooTest {
    public static void main(String[] args) {
        // 使用Animal类型的父类引用变量接收Dog和Cat对象
        Animal dog = new Dog("旺财");
        Animal cat = new Cat("咪咪");

        // 调用makeSound()方法
        dog.makeSound(); // 输出 "旺财：汪汪汪"
        cat.makeSound(); // 输出 "咪咪：喵喵喵"
    }
}

//解释：
//在上面的代码中，Animal接口定义了一个makeSound()方法，Mammal类实现了这个接口，并提供了一个受保护的构造方法Mammal(String name)，该方法用于初始化动物的名字。Dog和Cat类分别继承了Mammal类，并重写了makeSound()方法以输出特定的声音。ZooTest类创建了一个Dog对象和一个Cat对象，并通过Animal类型的引用变量调用了它们的makeSound()方法。

